home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / program / cgazv4n2.zip / SAVMOUSE.C < prev    next >
C/C++ Source or Header  |  1989-10-23  |  4KB  |  135 lines

  1. /****************************  SAVMOUSE.C  ************************
  2. *   This program saves and restores the mouse state.
  3. *   Verified with Mouse drivers from Logitech and Microsoft
  4. *   Compilers: Turbo C, Microsoft, Watcom
  5. *   Author: Andrew Binstock, Copyright (c) 1989
  6. *   Use freely as long as authorship is acknowledged.
  7. *******************************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <dos.h>
  11. #include <stdlib.h>
  12.  
  13. #define DRIVER 100
  14.  
  15. #define MOUSE_INT  0x33         /* Mouse interrupt number */
  16.  
  17. #if ! defined MK_FP             /* For Microsoft especially */
  18. #define MK_FP(seg,ofs)  ((void far *) \
  19.                (((unsigned long)(seg) << 16) | (unsigned)(ofs)))
  20. #endif
  21.  
  22. union  REGS   in, out;
  23. struct SREGS  segs;
  24.  
  25.  
  26. int check_mouse (void)    /* Returns -1 if no driver, 0 if no mouse */
  27. {                         /* Returns  1 if driver and mouse present */
  28.  
  29.     /* Get the address of MOUSE_INT             */
  30.     /* We do it the long way for portability.   */
  31.  
  32.     char far * mouse_vector;
  33.  
  34.     in.h.ah = 0x35;       /* Get-vector service */
  35.     in.h.al = MOUSE_INT;  /* Get mouse vector   */
  36.     int86x (0x21, &in, &out, &segs);
  37.  
  38.     mouse_vector = MK_FP(segs.es, out.x.bx);
  39.  
  40.     if ((long) mouse_vector == 0L || *mouse_vector == 0xCF)
  41.         return (-1);      /* No driver found    */
  42.  
  43.     /* Driver found, let us check and reset the mouse */
  44.     in.x.ax = 0;
  45.     int86 (MOUSE_INT, &in, &out);
  46.  
  47.     /* AX = -1, all went well, otherwise no mouse found */
  48.     return ((int) out.x.ax == -1 ? 1 : 0);
  49. }
  50.  
  51. size_t create_save_area (void far **mouse_ptr)  /* Get save area size */
  52. {                                               /* and allocate it.   */
  53.     size_t buffer_size;
  54.  
  55.     in.x.ax = 21;        /* Service 21d of mouse calls gets size */
  56.     int86 (MOUSE_INT, &in, &out);
  57.     buffer_size = out.x.bx;
  58.  
  59.     *mouse_ptr = (void far *) malloc (buffer_size);
  60.  
  61.     return (*mouse_ptr == NULL ? 0 : buffer_size);
  62. }
  63.  
  64. void save_mouse_state (void far * save_area)    /* Save mouse info. */
  65. {
  66.     in.x.ax = 22;
  67.     in.x.dx = FP_OFF (save_area);
  68.     segs.es = FP_SEG (save_area);
  69.     int86x (MOUSE_INT, &in, &out, &segs);
  70. }
  71.  
  72. void restore_mouse_state (void far * save_area) /* Restore saved info. */
  73. {
  74.     in.x.ax = 23;
  75.     in.x.dx = FP_OFF (save_area);
  76.     segs.es = FP_SEG (save_area);
  77.     int86x (MOUSE_INT, &in, &out, &segs);
  78. }
  79.  
  80. #ifdef DRIVER
  81.  
  82. #include <conio.h>
  83.  
  84. int main (void)
  85. {
  86.     size_t     mouse_area_size;
  87.     void far * mouse_area_ptr;
  88.  
  89.     switch (check_mouse())
  90.     {
  91.         case -1: fputs ("No Mouse Driver", stderr);
  92.                  exit (5);
  93.         case  0: fputs ("No Mouse Attached", stderr);
  94.                  exit (6);
  95.         case  1: fputs ("Driver and Mouse Found\n", stderr);
  96.                  break;
  97.     }
  98.  
  99.     if ((mouse_area_size = create_save_area (&mouse_area_ptr)) == 0)
  100.     {
  101.         fputs ("Mouse save area could not be allocated", stderr);
  102.         exit (7);
  103.     }
  104.     else 
  105.         printf ("Mouse area occupies %u bytes\n", mouse_area_size);
  106.  
  107.     in.x.ax = 0x01;   /* show mouse cursor */
  108.     int86 (MOUSE_INT, &in, &out);
  109.  
  110.     fputs ("Press 's' to save mouse ", stdout);
  111.     while (getche() != 's') ;
  112.  
  113.     save_mouse_state (mouse_area_ptr);
  114.  
  115.     in.x.ax = 8;     /* Lock the cursor into a couple of rows */
  116.     in.x.cx = 15;
  117.     in.x.dx = 22;
  118.     int86(MOUSE_INT, &in, &out);
  119.  
  120.     fputs ("\nYour cursor is locked into a narrow band\n", stdout);
  121.  
  122.     fputs ("Press 'r' to restore mouse ", stdout);
  123.     while (getche() != 'r') ;
  124.  
  125.     restore_mouse_state (mouse_area_ptr);
  126.  
  127.     fputs ("\nYour cursor is freed. Press any key to exit\n", stdout);
  128.     getche();
  129.  
  130.     in.x.ax = 0x02;   /* hide mouse cursor */
  131.     int86 (MOUSE_INT, &in, &out);
  132.  
  133.     return (1);
  134. }
  135. #endif